<?php
/**
 * Copyright (c) [2019] [吴跃忠]
 * [selibra] is licensed under the Mulan PSL v1.
 * You can use this software according to the terms and conditions of the Mulan PSL v1.
 * You may obtain a copy of Mulan PSL v1 at:
 * http://license.coscl.org.cn/MulanPSL
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
 * PURPOSE.
 * See the Mulan PSL v1 for more details.
 */

namespace LeoMQ\Annotations;

use \Attribute;
use LeoMQ\RealizeFactory;
use LeoMQ\SimpleMQSubscriber;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use Selibra\Di\AnnotationConfigure;
use Selibra\Di\AnnotationExecEntity;
use Selibra\Di\Annotations\Protocol\SelibraAnnotationInterface;

#[Attribute(Attribute::TARGET_METHOD)]
final class SimpleConsumer implements SelibraAnnotationInterface
{

    /**
     * @var string
     */
    protected string $queue;

    /**
     * @var string
     */
    protected string $consumerTag = '';


    /**
     * @var string|null
     */
    protected ?string $mq = null;

    /**
     * SimpleConsumer constructor.
     * @param $queue
     * @param string $consumerTag
     * @param null $mq 使用哪个队列，为空读取系统配置
     */
    public function __construct($queue, $consumerTag = '', $mq = null)
    {
        $this->queue = $queue;
        $this->consumerTag = $consumerTag;
        $this->mq = $mq;
    }

    /**
     * @param AnnotationExecEntity $annotationExecEntity
     * @return mixed
     * @throws \LeoMQ\Exceptions\NotFoundMQRealizeException
     * @throws \ReflectionException
     * @throws \Selibra\Di\Exception\NoImplementClass
     */
    public function exec(AnnotationExecEntity &$annotationExecEntity)
    {
        $simpleMQSubscriber = new SimpleMQSubscriber(
            $this->queue,
            $this->consumerTag,
            $annotationExecEntity->getClass(),
            $annotationExecEntity->getMethod()->getName()
        );
        RealizeFactory::getConsumer()->listen($simpleMQSubscriber);
    }

    /**
     * @param AnnotationConfigure $annotationConfigure
     * @return mixed
     */
    public function configure(AnnotationConfigure $annotationConfigure)
    {
        // TODO: Implement configure() method.
    }
}